package com.yuno.mock.dto;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 读取进度DTO
 * 
 * @author xrm
 * @since 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ReadProgress {
    
    /**
     * 请求ID
     */
    private String requestId;
    
    /**
     * 任务状态：PENDING（等待中）、RUNNING（运行中）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）
     */
    private String status;
    
    /**
     * 进度百分比（0-100）
     */
    private Double progressPercentage;
    
    /**
     * 当前阶段：INITIALIZING（初始化）、READING（读取中）、PROCESSING（处理中）、FINALIZING（完成中）
     */
    private String currentStage;
    
    /**
     * 阶段描述
     */
    private String stageDescription;
    
    /**
     * 总行数
     */
    private Long totalRows;
    
    /**
     * 已处理行数
     */
    private Long processedRows;
    
    /**
     * 成功处理行数
     */
    private Long successRows;
    
    /**
     * 失败行数
     */
    private Long failedRows;
    
    /**
     * 跳过行数
     */
    private Long skippedRows;
    
    /**
     * 当前处理的工作表
     */
    private String currentSheet;
    
    /**
     * 当前处理的行号
     */
    private Integer currentRow;
    
    /**
     * 开始时间
     */
    private LocalDateTime startTime;
    
    /**
     * 当前时间
     */
    private LocalDateTime currentTime;
    
    /**
     * 预计完成时间
     */
    private LocalDateTime estimatedEndTime;
    
    /**
     * 已用时间（毫秒）
     */
    private Long elapsedTimeMs;
    
    /**
     * 预计剩余时间（毫秒）
     */
    private Long estimatedRemainingTimeMs;
    
    /**
     * 处理速度（行/秒）
     */
    private Double processingSpeed;
    
    /**
     * 平均处理速度（行/秒）
     */
    private Double avgProcessingSpeed;
    
    /**
     * 内存使用情况（MB）
     */
    private Double memoryUsageMb;
    
    /**
     * 线程使用情况
     */
    private ThreadUsage threadUsage;
    
    /**
     * 分片进度信息
     */
    private ShardProgress shardProgress;
    
    /**
     * 错误统计
     */
    private ErrorStats errorStats;
    
    /**
     * 最后更新时间
     */
    private LocalDateTime lastUpdateTime;
    
    /**
     * 自定义属性
     */
    private Map<String, Object> customAttributes;
    
    /**
     * 线程使用情况内部类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ThreadUsage {
        /**
         * 活跃线程数
         */
        private Integer activeThreads;
        
        /**
         * 总线程数
         */
        private Integer totalThreads;
        
        /**
         * 队列中等待的任务数
         */
        private Integer queuedTasks;
        
        /**
         * 已完成的任务数
         */
        private Long completedTasks;
        
        /**
         * 线程池利用率（0-1）
         */
        private Double threadPoolUtilization;
    }
    
    /**
     * 分片进度信息内部类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ShardProgress {
        /**
         * 总分片数
         */
        private Integer totalShards;
        
        /**
         * 已完成分片数
         */
        private Integer completedShards;
        
        /**
         * 正在处理的分片数
         */
        private Integer processingShards;
        
        /**
         * 等待处理的分片数
         */
        private Integer pendingShards;
        
        /**
         * 失败的分片数
         */
        private Integer failedShards;
        
        /**
         * 分片完成百分比
         */
        private Double shardCompletionPercentage;
        
        /**
         * 最快分片处理时间（毫秒）
         */
        private Long fastestShardTimeMs;
        
        /**
         * 最慢分片处理时间（毫秒）
         */
        private Long slowestShardTimeMs;
        
        /**
         * 平均分片处理时间（毫秒）
         */
        private Long avgShardTimeMs;
    }
    
    /**
     * 错误统计内部类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ErrorStats {
        /**
         * 总错误数
         */
        private Integer totalErrors;
        
        /**
         * 数据格式错误数
         */
        private Integer dataFormatErrors;
        
        /**
         * 数据类型错误数
         */
        private Integer dataTypeErrors;
        
        /**
         * 约束违反错误数
         */
        private Integer constraintViolationErrors;
        
        /**
         * 系统错误数
         */
        private Integer systemErrors;
        
        /**
         * 最近的错误消息
         */
        private String lastErrorMessage;
        
        /**
         * 最近的错误时间
         */
        private LocalDateTime lastErrorTime;
        
        /**
         * 错误率（0-1）
         */
        private Double errorRate;
    }
}